
import oss2
import os
import traceback

#上传音频文件到阿里云,并返回文件的url
def uploadAudioFilesToAlibabaCloud(filename,saveFileName,accesskey_id,accesskey_secret,endpoint,bucketname,callBackfun_progress=None):
    '''
    上传音频文件到阿里云,并返回文件的url
    :param filename:本地文件名
    :param saveFileName:保存在oss的完整文件路径,不包括buckettname
    :param accesskey_id:
    :param accesskey_secret:
    :param endpoint:
    :param bucketname:
    :param fun_progress:回调函数progress(consumed_bytes,total_bytes),可以查看进度
    :return:(bool是否成功,str url地址)
    '''
    # -*- coding: utf-8 -*-
    # 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
    auth = oss2.Auth(accesskey_id, accesskey_secret)
    # yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1（杭州）为例，Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
    # 填写Bucket名称。
    bucket = oss2.Bucket(auth, endpoint, bucketname)

    # 必须以二进制的方式打开文件。
    # 填写本地文件的完整路径。如果未指定本地路径，则默认从示例程序所属项目对应本地路径中上传文件。
    try:
        with open(filename, 'rb') as fileobj:
            # 回调函数
            def progress(consumed_bytes, total_bytes):
                print(consumed_bytes / total_bytes)

            # Seek方法用于指定从第1000个字节位置开始读写。上传时会从您指定的第1000个字节位置开始上传，直到文件结束。
            fileobj.seek(1000, os.SEEK_SET)
            # Tell方法用于返回当前位置。
            current = fileobj.tell()
            # 填写Object完整路径。Object完整路径中不能包含Bucket名称。
            if callBackfun_progress == None:
                bucket.put_object(key=saveFileName, data=fileobj, progress_callback=progress)
            else:
                bucket.put_object(key=saveFileName, data=fileobj, progress_callback=callBackfun_progress)
    except Exception as e:
        msg = traceback.format_exc()
        return False,msg
    else:
        #阻塞 返回URL
        url_li=[]
        url_li.append('https://')
        url_li.append(bucketname+'.')
        url_li.append(endpoint+'/')
        url_li.append(saveFileName)
        url_str=''.join(url_li)
        return True,url_str



#删除oss中的文件
def deleteFileFromAlibabaCloud(accesskey_id,accesskey_secret,endpoint,bucketname,deleteFileName):
    # -*- coding: utf-8 -*-
    # 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
    auth = oss2.Auth(accesskey_id, accesskey_secret)
    # yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1（杭州）为例，Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
    # 填写Bucket名称，例如examplebucket。
    bucket = oss2.Bucket(auth, endpoint, bucketname)

    # 删除文件。
    # yourObjectName填写待删除文件的完整路径，完整路径中不包含Bucket名称，例如exampledir/exampleobject.txt。
    # 如需删除文件夹，请将yourObjectName设置为对应的文件夹名称。如果文件夹非空，则需要将文件夹下的所有文件删除后才能删除该文件夹。
    try:
        bucket.delete_object(deleteFileName)
    except Exception as e:
        return False,e
    else:
        return True,''

if __name__ == '__main__':
    uploadAudioFilesToAlibabaCloud('F:/test.mp3','LTAI5t7Eixxxxxxxxxxxx9y34BKH','4nC52DprzwYxxxxxxxxrktUl9R','ossxxaliyuncs.com','180xxxxxxx5')